﻿
/**
    \file EM_os.h

    This header file is part of OS Abstraction module.
    In this file the platform specific data types are abstracted and
    mapped to data types used within the Stack.

    Version: FreeRTOS
*/

#ifndef _H_EM_OS_
#define _H_EM_OS_

/* OSAL Defines */
//#define EM_DISABLE_ALL_DEBUG
/* #define EM_ENABLE_DISABLE_RUNTIME_DEBUG */
/* #define EM_DISABLE_DEBUG_LOG_ON_STARTUP */

/* -------------------------------------------- Header File Inclusion */
#include "EM_platform.h"

/* -------------------------------------------- Global Definitions */
#define EM_SUCCESS                  0x0000
#define EM_FAILURE                  0xFFFF

#define EM_USE_EXT_TIMER

/* -------------------------------------------- Structures/Data Types */
/* 'signed' datatype of size '1 octet' */
typedef char CHAR;
/* 'signed' datatype of size '1 octet' */
typedef char INT8;
/* 'unsigned' datatype of size '1 octet' */
typedef unsigned char UCHAR;
/* 'unsigned' datatype of size '1 octet' */
typedef unsigned char UINT8;
/* 'signed' datatype of size '2 octet' */
typedef short int INT16;
/* 'unsigned' datatype of size '2 octet' */
typedef unsigned short int UINT16;
/* 'signed' datatype of size '4 octet' */
typedef int INT32;
/* 'unsigned' datatype of size '4 octet' */
typedef unsigned int  UINT32;
/* 'unsigned' datatype of size '8 octet' */
typedef unsigned long long UINT64;

/* 'unsigned' datatype of size '1 octet' */
typedef unsigned char BOOLEAN;

/*
    Generic handle can used for the unknow
    datatypes (e.g. Mutex Type, Conditional Type etc.)
*/
typedef void* EM_GENERIC_HANDLE;

/* Datatype to represent Thread or Task Identifier */
typedef void EM_thread_type;
/* Datatype to represent Thread or Task Attribute */
typedef void EM_thread_attr_type;
/* Datatype to represent Mutex object */
typedef void EM_thread_mutex_type;
/* Datatype to represent Attributes of a Mutex object */
typedef void EM_thread_mutex_attr_type;
/* Datatype to represent Conditional Variable object */
typedef void EM_thread_cond_type;
/* Datatype to represent Attributes of a Conditional Variable object */
typedef void EM_thread_cond_attr_type;

/* Datatype to represent File Handle */
typedef EM_GENERIC_HANDLE EM_FILE_HANDLE;

/* Data type to represent the OS time for the platform */
typedef int              EM_time_type;

/* Data types for task parameters and retun types */
typedef void* EM_THREAD_RETURN_TYPE;
typedef void* EM_THREAD_ARGS;
typedef EM_THREAD_RETURN_TYPE (*EM_THREAD_START_ROUTINE)(EM_THREAD_ARGS);

/* Function Return Value typwe */
typedef UINT16 EM_RESULT;

/* --------------------------------------------------- Macros */

#define EM_THREAD_RETURN_VAL_SUCCESS NULL
#define EM_THREAD_RETURN_VAL_FAILURE NULL

/* Declaration of 'static' variable/function */
#ifdef EM_HAVE_STATIC_DECL
    #define DECL_STATIC                     static
#else  /* EM_HAVE_STATIC_DECL */
    #define DECL_STATIC
#endif /* EM_HAVE_STATIC_DECL */

/* Declaration of 'const' variable */
#ifdef EM_HAVE_CONST_DECL
    #define DECL_CONST                      const
#else  /* EM_HAVE_CONST_DECL */
    #define DECL_CONST
#endif /* EM_HAVE_CONST_DECL */

/* Reentrant Function Declaration */
#ifdef EM_HAVE_REENTRANT_DECL
    #define DECL_REENTRANT                  reentrant
#else /* EM_HAVE_REENTRANT_DECL */
    #define DECL_REENTRANT
#endif /* EM_HAVE_REENTRANT_DECL */

#define DECL_CONST_QUALIFIER

/* Abstractions for String library functions */
#define EM_str_len(s)                 strlen((char *)(s))
#define EM_str_copy(d, s)             strcpy((char *)(d), (char *)(s))
#define EM_str_n_copy(d, s, n)        strncpy((char *)(d), (char *)(s), n)
#define EM_str_cmp(s1, s2)            strcmp((char *)(s1), (char *)(s2))
#define EM_str_n_cmp(s1, s2, n)       strncmp((char *)(s1), (char *)(s2), n)
#define EM_str_cat(d, s)              strcat((char *)(d), (char *)(s))
#define EM_str_str(s, ss)             strstr((char *)(s), (char *)(ss))
#define EM_str_n_casecmp(s1, s2, n)   _strnicmp ((char *)(s1), (char *)(s2), n)

/* Abstractions for memory functions */
#define EM_mem_move(d, s, n)          memmove((d), (s), (n))
#define EM_mem_cmp(p1, p2, n)         memcmp((p1), (p2), (n))
#define EM_mem_set(p, v, n)           memset((p), (v), (n))
#define EM_mem_copy(p1, p2, n)        memcpy((p1), (p2), (n))

/* -------------------------------------------- Function Declarations */
#ifdef __cplusplus
extern "C" {
#endif

/** Initialize the OS */
void EM_os_init(void);

/* Task/Thread Creation Primitives */
INT32 EM_thread_create
(
    /* OUT */ EM_thread_type*          thread,
    /* IN */  EM_thread_attr_type*     thread_attr,
    /* IN */  EM_THREAD_START_ROUTINE  start_routine,
    /* IN */  void*                    thread_args
);

INT32 EM_thread_attr_init
(
    /* OUT */ EM_thread_attr_type*     thread_attr
);

/* Task/Thread Synchronization Primitives */
INT32 EM_thread_mutex_init
(
    /* OUT */ EM_thread_mutex_type*          mutex,
    /* IN */  EM_thread_mutex_attr_type*     mutex_attr
);

INT32 EM_thread_mutex_lock
(
    /* INOUT */ EM_thread_mutex_type*     mutex
);

INT32 EM_thread_mutex_unlock
(
    /* INOUT */ EM_thread_mutex_type*     mutex
);

INT32 EM_thread_cond_init
(
    /* OUT */ EM_thread_cond_type*          cond,
    /* IN */  EM_thread_cond_attr_type*     cond_attr
);

void EM_thread_cond_wait
(
    /* INOUT */ EM_thread_cond_type*      cond,
    /* INOUT */ EM_thread_mutex_type*     cond_mutex
);

INT32 EM_thread_cond_signal
(
    /* INOUT */ EM_thread_cond_type*     cond
);

/* Memory Management Primitives */
void* EM_alloc_mem (/* IN */ UINT32 size);
void EM_free_mem (/* IN */ void* ptr);

/* Task/Thread Delay Primitives */
void EM_sleep ( /* IN */ UINT32 tm );
void EM_usleep ( /* IN */ UINT32 tm );
void EM_get_current_time (/* OUT */ UINT32* curtime);
void EM_get_local_time( /* OUT */ UCHAR* buf, /* IN */ UINT16 buf_len);

#ifdef __cplusplus
};
#endif

#endif /* _H_EM_OS_ */


